import nodemailer from 'nodemailer';
import { EMAIL_CONFIG, APP_NAME } from '../config';
import fs from 'fs';
import path from 'path';

const templates = {
  userCreatedNotice: {
    subject: '邀请用户',
    text: '{{username}}（{{email}}）正在邀请您加入活动管理后台。\n加入后，您可使用该后台在线快速编辑营销活动页，监测投放数据。\n如您同意加入，您可在收到此封邮件后的48小时内，复制此链接（{{link}}）并在浏览器中打开，接受邀请并设置您的登录密码。 如您拒绝加入，可忽略本封邮件。您的账号将不会被创建。',
    html: fs.readFileSync(path.resolve(__dirname, '../email/templates/userCreatedNotice.html'), 'utf-8')
  },
  resetPass: {
    subject: '重置密码',
    text: '活动管理后台用户{username}（{email}）正在申请重置密码。\n您可在收到此封邮件后的48小时内，复制此链接（{{link}}）并在浏览器中打开完成密码重置。',
    html: fs.readFileSync(path.resolve(__dirname, '../email/templates/resetPass.html'), 'utf-8')
  }
};

/**
 * 将模板数据写入到html模板中
 * @param {String} template 模板字符串
 * @param {Object} data 模板数据
 */
function renderTemplate(template = '', data = {}) {
  let result = template;
  Object.keys(data).forEach(item => {
    result = result.replace(new RegExp(`{${item}}`, 'g'), data[item]);
  });
  return result;
}

/**
 * 发送邮件的函数
 *
 * @param {string} email 邮件发送方
 * @param {string} template 发送模板
 * @param {object} data 数据
 */
export async function sendEmail(email = '', template = '', data = {}) {
  return new Promise(async (resolve, reject) => {
    // 参数验证
    if (!email) reject(new Error('邮箱不能为空'));
    if (!template) reject(new Error('模板不能为空'));
    if (!data) reject(new Error('模板数据不能为空'));

    try {
      // 建立起SMPT连接
      const transporter = nodemailer.createTransport(EMAIL_CONFIG);

      // 发送群邮件
      const info = await transporter.sendMail({
        from: EMAIL_CONFIG.from,
        to: email,
        subject: templates[template].subject,
        html: renderTemplate(templates[template].html, { appName: APP_NAME, ...data })
      });

      if (info && info.messageId) {
        resolve(true);
      } else {
        console.log('邮件发送失败', info);
        reject(new Error('邮件发送失败'));
      }
    } catch (error) {
      console.log('邮件发送失败', error);
      reject(error);
    }
  });
}

/**
 * 测试发送邮件
 */
// (async function() {
//   console.log(await sendEmail('andyliwr@outlook.com', 'userCreatedNotice', {
//     appName: APP_NAME,
//     creator: '李迪康',
//     newUserName: '子陵',
//     newEmail: 'andyliwr@qq.com',
//     password: 'asdas12312asdas',
//     link: 'http://www.baidu.com',
//   }))
// })()
